package com.szxy.cart.service.impl;

import com.szxy.cart.feigin.CommonItemsFeignClient;
import com.szxy.cart.feigin.CommonRedisFeignClient;
import com.szxy.cart.service.RedisCartService;
import com.szxy.pojo.TbItem;
import com.szxy.utils.CartItem;
import com.szxy.utils.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * @Auther:zwer
 * @Date:2019/9/12 17:45
 * @Description:com.szxy.cart.service.impl
 * @Version:1.0
 **/
@Service
public class RedisCartServiceImpl implements RedisCartService {

    @Autowired
    private CommonItemsFeignClient commonItemsFeignClient;
    @Autowired
    private CommonRedisFeignClient commonRedisFeignClient;

    @Override
    public Result updateItemNum(Long itemId, Integer num, String userId) {
        Map<String, CartItem> cart = this.getCurrentCart(userId);
        if(cart != null){
            CartItem cartItem = cart.get(itemId.toString());
            if(cartItem != null){
                cartItem.setNum(num);
                this.addCartToRedis(cart,userId);
                return Result.ok();
            }
        }
        return Result.error("更新失败...");
    }

    @Override
    public Result deleteItemFromCart(Long itemId, String userId) {
        Map<String, CartItem> cart = this.getCurrentCart(userId);
        if(cart != null){
            cart.remove(itemId.toString()); //删除指定商品
            this.addCartToRedis(cart,userId);
            return Result.ok();
        }
        return Result.error("删除超时...");
    }


    @Override
    public Result goSettlement(String[] ids, String userId) {
        // 获取当前购物车
        Map<String, CartItem> cart = this.getCurrentCart(userId);
        // 从购物车中选出需要结算的商品
        List<CartItem> list = this.getSetttlementList(cart,ids);
        return Result.ok(list);
    }

    // 从购物车中选出需要结算的商品
    private List<CartItem> getSetttlementList(Map<String, CartItem> cart, String[] ids) {
        ArrayList<CartItem> list = new ArrayList<>();
        for(String id : ids){
            list.add(cart.get(id));
        }
        return list;
    }

    @Override
    public Result addItem(Long itemId, Integer num, String userId) {
        //1. 查询添加的商品信息
        TbItem item = this.commonItemsFeignClient.findItemById(itemId);
        //2. 获取当前购物车
        Map<String, CartItem> cart = this.getCurrentCart(userId);
        //3. 将查询到的商品添加到购物车
        this.addItemToCart(item, cart, num);
        //4. 将购物车放入 Redis 缓存中
        this.addCartToRedis(cart, userId);
        return Result.ok();
    }

    @Override
    public Result showCart(String userId) {
        ArrayList<CartItem> cartItems = new ArrayList<>();
        Map<String, CartItem> cartItemMap = this.getCurrentCart(userId);
        for (String key : cartItemMap.keySet()) {
            cartItems.add(cartItemMap.get(key));
        }
        return Result.ok(cartItems);
    }

    //2. 获取当前购物车
    private Map<String, CartItem> getCurrentCart(String userId) {
        try {
            Map<String, CartItem> map =
                    this.commonRedisFeignClient.selectCartByUserId(userId);
            if (map != null) {
                return map;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new HashMap<String, CartItem>();
    }

    //3. 将查询到的商品添加到购物车中
    private void addItemToCart(TbItem item, Map<String, CartItem> cart, Integer num) {
        CartItem cartItem = null;
        // 判断当前 item.getId() 作为 可以，查到对应的 value 是否存在
        cartItem = cart.get(item.getId().toString());// 注意： item 对象的 id 是 Long 类型，而 Map 对象的 key 是 String 类型
        if (cartItem == null) {
            // 若不存在购物车中，则创建 CartItem 对象加入 Map 集合中
            cartItem = new CartItem();
            cartItem.setId(item.getId());
            cartItem.setTitle(item.getTitle());
            cartItem.setNum(num);
            cartItem.setPrice(item.getPrice());
            cartItem.setSell_point(item.getSellPoint());
            cartItem.setImage(item.getImage());
            cart.put(item.getId().toString(), cartItem);
        } else {
            // 若存在购物车中，则只修改该 cartItem 对象的 num 属性
            cartItem.setNum(cartItem.getNum() + num);
        }
    }

    //4. 将购物车放入 Redis 缓存中
    private void addCartToRedis(Map<String, CartItem> cart, String userId) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("userId", userId);
        map.put("cart", cart);
        this.commonRedisFeignClient.insertToCart(map);
    }

}

